home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / COMBOBOX.PAK / COMBOBXX.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  15KB  |  578 lines

  1. // ---------------------------------------------------------------------------
  2. // ObjectWindows
  3. // Copyright (C) 1991, 1995 by Borland International, All Rights Reserved
  4. // ---------------------------------------------------------------------------
  5. #include <owl/pch.h>
  6. #include <owl/applicat.h>
  7. #include <owl/framewin.h>
  8. #include <owl/static.h>
  9. #include <owl/combobox.h>
  10. #include <owl/inputdia.h>
  11. #include <owl/validate.h>
  12. #include "combobox.rh"
  13.  
  14. const uint16 ID_CB_BASE                = 200;
  15. const uint16 ID_SIMPLE_COMBOBOX        = ID_CB_BASE;
  16. const uint16 ID_DROPDOWN_COMBOBOX      = ID_CB_BASE + 1;
  17. const uint16 ID_DROPDOWNLIST_COMBOBOX  = ID_CB_BASE + 2;
  18.  
  19. //
  20. // class TComboBoxWindow
  21. // ~~~~~ ~~~~~~~~~~~~~~~
  22. class TComboBoxWindow : public TWindow {
  23.   public:
  24.     TComboBoxWindow();
  25.    ~TComboBoxWindow();
  26.  
  27.     // override method defined by TFrameWindow
  28.     //
  29.     void Paint(TDC&, bool, TRect&);
  30.  
  31.     // message response functions
  32.     //
  33.     void CbnSelChange();
  34.  
  35.     void CmSimple();                  // create simple combobox.
  36.     void CmDropDown();                // create drop-down combobox.
  37.     void CmDropDownList();            // create drop-down-list combobox.
  38.     void CmAddString();               // add string to listbox of combobox.
  39.     void CmAddStringAt();             // add string at index position.
  40.     void CmFindString();              // goto/display index of given string.
  41.     void CmFindStringAt();            // goto index, display string.
  42.     void CmDeleteString();            // delete string.
  43.     void CmDeleteStringAt();          // delete string at index.
  44.     void CmClear();                   // clear combobox.
  45.     void CmShowList();                // show listbox part.
  46.     void CmHideList();                // hide listbox part.
  47.  
  48.     void CeSimple(TCommandEnabler& commandHandler);
  49.     void CeDropDown(TCommandEnabler& commandHandler);
  50.     void CeDropDownList(TCommandEnabler& commandHandler);
  51.     void CeNotSimple(TCommandEnabler& commandHandler);
  52.     void CeAny(TCommandEnabler& commandHandler);
  53.  
  54.   private:
  55.     TComboBox*        ComboBox;               // combobox.
  56.     TStatic*          ComboBoxTitle;          // combobox title.
  57.     TStatic*          CurSelOfListBox;        // text of selected string.
  58.     TStatic*          CurSelIndexOfListBox;   // index of selected string.
  59.     TStatic*          CurEditString;          // string of edit control.
  60.     TStatic*          SelStringLength;        // length of selected string.
  61.     TStatic*          EditStringLength;       // length of edit string.
  62.     uint              WhichComboBox;          // current combobox.
  63.  
  64.     static const int  TextLen;
  65.  
  66.     void  ResetTextFields();                  // reset text fields to blanks.
  67.     void  UpdateTextFields();                 // updates from combobox.
  68.     int   InputNumber(char* pmpt, char* s);   // get number from user.
  69.     int   InputString(char* pmpt, char* s);   // get string from user.
  70.                                               // get string and number.
  71.     int   InputStringAndNumber(char* pmpt, char* s, int& n);
  72.  
  73.   DECLARE_RESPONSE_TABLE(TComboBoxWindow);
  74. };
  75.  
  76.  
  77. //
  78. //
  79. //
  80. DEFINE_RESPONSE_TABLE1(TComboBoxWindow, TWindow)
  81.   EV_CBN_SELCHANGE(ID_SIMPLE_COMBOBOX,        CbnSelChange),
  82.   EV_CBN_SELCHANGE(ID_DROPDOWN_COMBOBOX,      CbnSelChange),
  83.   EV_CBN_SELCHANGE(ID_DROPDOWNLIST_COMBOBOX,  CbnSelChange),
  84.   EV_COMMAND(CM_SIMPLE,                 CmSimple),
  85.   EV_COMMAND(CM_DROPDOWN,               CmDropDown),
  86.   EV_COMMAND(CM_DROPDOWN_LIST,          CmDropDownList),
  87.   EV_COMMAND(CM_ADD_STRING,             CmAddString),
  88.   EV_COMMAND(CM_ADD_STRING_AT,          CmAddStringAt),
  89.   EV_COMMAND(CM_FIND_STRING,            CmFindString),
  90.   EV_COMMAND(CM_FIND_STRING_AT,         CmFindStringAt),
  91.   EV_COMMAND(CM_DELETE_STRING,          CmDeleteString),
  92.   EV_COMMAND(CM_DELETE_STRING_AT,       CmDeleteStringAt),
  93.   EV_COMMAND(CM_CLEAR,                  CmClear),
  94.   EV_COMMAND(CM_SHOW_LIST,              CmShowList),
  95.   EV_COMMAND(CM_HIDE_LIST,              CmHideList),
  96.   EV_COMMAND_ENABLE(CM_SIMPLE,          CeSimple),
  97.   EV_COMMAND_ENABLE(CM_DROPDOWN,        CeDropDown),
  98.   EV_COMMAND_ENABLE(CM_DROPDOWN_LIST,   CeDropDownList),
  99.   EV_COMMAND_ENABLE(CM_ADD_STRING,      CeAny),
  100.   EV_COMMAND_ENABLE(CM_ADD_STRING_AT,   CeAny),
  101.   EV_COMMAND_ENABLE(CM_FIND_STRING,     CeAny),
  102.   EV_COMMAND_ENABLE(CM_FIND_STRING_AT,  CeAny),
  103.   EV_COMMAND_ENABLE(CM_DELETE_STRING,   CeAny),
  104.   EV_COMMAND_ENABLE(CM_DELETE_STRING_AT,CeAny),
  105.   EV_COMMAND_ENABLE(CM_CLEAR,           CeAny),
  106.   EV_COMMAND_ENABLE(CM_SHOW_LIST,       CeNotSimple),
  107.   EV_COMMAND_ENABLE(CM_HIDE_LIST,       CeNotSimple),
  108. END_RESPONSE_TABLE;
  109.  
  110.  
  111. const int TComboBoxWindow::TextLen = 31;
  112.  
  113. //
  114. //
  115. //
  116. TComboBoxWindow::TComboBoxWindow()
  117. :
  118.   TWindow(0, 0, 0)
  119. {
  120.   ComboBox = 0;
  121.   ComboBoxTitle = 0;
  122.   WhichComboBox = 0;
  123.  
  124.   // setup static text area.
  125.   //
  126.   new TStatic(this, -1, "Current selection:",  200, 30, 122, 18, 18);
  127.   CurSelOfListBox = new TStatic(this, -1, " ",  392, 30, 158, 18, 25);
  128.  
  129.   new TStatic(this, -1, "Index of current selection:",  200, 52, 176, 18, 28);
  130.   CurSelIndexOfListBox = new TStatic(this, -1, " ",  392, 52, 158, 18, 25);
  131.  
  132.   new TStatic(this, -1, "Length of current selection:",  200, 76, 184, 18, 30);
  133.   SelStringLength = new TStatic(this, -1, " ",  392, 76, 158, 18, 25);
  134.  
  135.   new TStatic(this, -1, "Edit control string:",  200, 103, 124, 18, 30);
  136.   CurEditString= new TStatic(this, -1, " ",  392, 103, 158, 18, 25);
  137.  
  138.   new TStatic(this, -1, "Length of edit control string:",  200, 125, 186, 18, 30);
  139.   EditStringLength = new TStatic(this, -1, " ",  392, 125, 158, 18, 25);
  140. }
  141.  
  142.  
  143. //
  144. // Cleanup the last combobox created.
  145. //
  146. TComboBoxWindow::~TComboBoxWindow()
  147. {
  148.   delete ComboBox;
  149. }
  150.  
  151.  
  152. //
  153. // make sure comboboxes are not dropped, if they are, they'll be left floating
  154. //
  155. void
  156. TComboBoxWindow::Paint(TDC&, bool, TRect&)
  157. {
  158.   if (ComboBox)
  159.     ComboBox->HideList();
  160. }
  161.  
  162.  
  163. //
  164. // A selection of the listbox part of the combobox has taken place.
  165. // Update text info.
  166. //
  167. void
  168. TComboBoxWindow::CbnSelChange()
  169. {
  170.   UpdateTextFields();
  171. }
  172.  
  173.  
  174. //
  175. // 'ComboBox|Simple' menu item.  Create simple combobox and fill it with some
  176. // strings.
  177. //
  178. void
  179. TComboBoxWindow::CmSimple()
  180. {
  181.   if (ComboBox) {
  182.     ComboBox->Destroy();
  183.     delete ComboBox;
  184.   }
  185.  
  186.   if (ComboBoxTitle) {
  187.     ComboBoxTitle->Destroy();
  188.     delete ComboBoxTitle;
  189.   }
  190.   ComboBoxTitle = new TStatic(this, -1, "Simple:", 10, 10, 150, 15);
  191.   ComboBoxTitle->Create();
  192.  
  193.   ComboBox = new TComboBox(this, ID_SIMPLE_COMBOBOX, 10, 30, 150, 150,
  194.                            CBS_SIMPLE, 25);
  195.   ComboBox->Create();
  196.   ComboBox->SetFocus();
  197.   ComboBox->AddString("abc");
  198.   ComboBox->AddString("DEFG");
  199.   ComboBox->AddString("12345");
  200.   ComboBox->AddString("OWL");
  201.  
  202.   WhichComboBox = ID_SIMPLE_COMBOBOX;
  203.  
  204.   ResetTextFields();
  205.   UpdateTextFields();
  206. }
  207.  
  208.  
  209. //
  210. // 'ComboBox|Drop Down' menu item.  Create drop down combobox and fill it some
  211. // some strings.
  212. //
  213. void
  214. TComboBoxWindow::CmDropDown()
  215. {
  216.   if (ComboBox) {
  217.     ComboBox->Destroy();
  218.     delete ComboBox;
  219.   }
  220.  
  221.   if (ComboBoxTitle) {
  222.     ComboBoxTitle->Destroy();
  223.     delete ComboBoxTitle;
  224.   }
  225.  
  226.   ComboBoxTitle = new TStatic(this, -1, "Drop Down:", 10, 10, 150, 15);
  227.   ComboBoxTitle->Create();
  228.  
  229.   ComboBox = new TComboBox(this, ID_DROPDOWN_COMBOBOX, 10, 30, 150, 150,
  230.                            CBS_DROPDOWN, 25);
  231.   ComboBox->Create();
  232.   ComboBox->SetFocus();
  233.   ComboBox->AddString("Jack");
  234.   ComboBox->AddString("Denice");
  235.   ComboBox->AddString("If then else");
  236.   ComboBox->AddString("a");
  237.   ComboBox->AddString("99");
  238.   ComboBox->AddString("42");
  239.   ComboBox->AddString("Help!");
  240.   ComboBox->AddString("windows");
  241.  
  242.   WhichComboBox = ID_DROPDOWN_COMBOBOX;
  243.  
  244.   ResetTextFields();
  245.   UpdateTextFields();
  246. }
  247.  
  248. //
  249. // 'ComboBox|Drop Down List' menu item.  Create drop down list combobox and fill
  250. // it with some strings.
  251. //
  252. void
  253. TComboBoxWindow::CmDropDownList()
  254. {
  255.   if (ComboBox) {
  256.     ComboBox->Destroy();
  257.     delete ComboBox;
  258.   }
  259.  
  260.   if (ComboBoxTitle) {
  261.     ComboBoxTitle->Destroy();
  262.     delete ComboBoxTitle;
  263.   }
  264.  
  265.   ComboBoxTitle = new TStatic(this, -1, "Drop Down List:", 10, 10, 150, 15);
  266.   ComboBoxTitle->Create();
  267.  
  268.   ComboBox = new TComboBox(this, ID_DROPDOWNLIST_COMBOBOX, 10, 30, 150, 150,
  269.                            CBS_DROPDOWNLIST, 25);
  270.   ComboBox->Create();
  271.   ComboBox->SetFocus();
  272.   ComboBox->AddString("A B C D");
  273.   ComboBox->AddString("[^abc]");
  274.   ComboBox->AddString("1234567890");
  275.   ComboBox->AddString("C++");
  276.   ComboBox->AddString("Just a string");
  277.   ComboBox->AddString("and another!");
  278.  
  279.   WhichComboBox = ID_DROPDOWNLIST_COMBOBOX;
  280.  
  281.   ResetTextFields();
  282.   UpdateTextFields();
  283. }
  284.  
  285. //
  286. // Add a string to the listbox part of the combobox.
  287. //
  288. void
  289. TComboBoxWindow::CmAddString()
  290. {
  291.   char buf[TextLen] = "";
  292.  
  293.   if (InputString("Enter string:", buf)) {
  294.     ComboBox->AddString(buf);
  295.     UpdateTextFields();
  296.   }
  297. }
  298.  
  299. //
  300. // Insert a string at a given index in the listbox part of the combobox.
  301. //
  302. void
  303. TComboBoxWindow::CmAddStringAt()
  304. {
  305.   char buf[TextLen] = "";
  306.   int  index;
  307.  
  308.   if (InputStringAndNumber("Enter string:", buf, index)) {
  309.     if (ComboBox->InsertString(buf, index) != CB_ERR)
  310.       UpdateTextFields();
  311.     else
  312.       MessageBox("Index out of range", "Error", MB_OK);
  313.   }
  314. }
  315.  
  316. //
  317. // Find string.  Tell combobox to select string at given index.
  318. // Update text fields.
  319. //
  320. void
  321. TComboBoxWindow::CmFindString()
  322. {
  323.   char buf[TextLen] = "";
  324.   int  index;
  325.  
  326.   if (InputString("Enter string:", buf)) {
  327.     if ((index = ComboBox->FindString(buf, 0)) != CB_ERR) {
  328.       ComboBox->SendMessage(CB_SETCURSEL, index, 0);
  329.       UpdateTextFields();
  330.     }
  331.     else
  332.       MessageBox("String not found", "Error", MB_OK);
  333.   }
  334. }
  335.  
  336. //
  337. // Find string.  Tell combobox to select string at given index.
  338. // Update text fields.  Assumes index input is correct, else atoi()
  339. // will return 0 and will be used to select the first string.
  340. //
  341. void
  342. TComboBoxWindow::CmFindStringAt()
  343. {
  344.   char buf[TextLen] = "";
  345.   int  index;
  346.  
  347.   if (InputNumber("Enter number:", buf)) {
  348.     index = atoi(buf);
  349.     if (ComboBox->GetString(buf, index) != CB_ERR) {
  350.       ComboBox->SendMessage(CB_SETCURSEL, index, 0);
  351.       UpdateTextFields();
  352.     }
  353.     else
  354.       MessageBox("Index out of range", "Error", MB_OK);
  355.   }
  356. }
  357.  
  358. //
  359. // Delete string.  Delete string input by user.
  360. //
  361. void
  362. TComboBoxWindow::CmDeleteString()
  363. {
  364.   char buf[TextLen] = "";
  365.   int  index;
  366.  
  367.   if (InputString( "Enter string:", buf)) {
  368.     if ((index = ComboBox->FindString(buf, 0)) != CB_ERR) {
  369.       ComboBox->DeleteString(index);
  370.       UpdateTextFields();
  371.     }
  372.     else
  373.        MessageBox("String not found", "Error", MB_OK);
  374.   }
  375. }
  376.  
  377. //
  378. // Delete string.  Delete string at given index.
  379. //
  380. void
  381. TComboBoxWindow::CmDeleteStringAt()
  382. {
  383.   char buf[TextLen] = "";
  384.   int  index;
  385.  
  386.   if (InputNumber("Enter number:", buf)) {
  387.     index = atoi(buf);
  388.     if (ComboBox->GetString(buf, index) != CB_ERR) {
  389.       ComboBox->DeleteString(index);
  390.       UpdateTextFields();
  391.     }
  392.     else
  393.       MessageBox("Index out of range", "Error", MB_OK);
  394.   }
  395. }
  396.  
  397. //
  398. // Clear.  Clear edit control and listbox part of combobox.
  399. //
  400. void
  401. TComboBoxWindow::CmClear()
  402. {
  403.   ComboBox->Clear();
  404.   ComboBox->ClearList();
  405.   ResetTextFields();
  406. }
  407.  
  408. //
  409. // Show listbox part of combobox.
  410. //
  411. void
  412. TComboBoxWindow::CmShowList()
  413. {
  414.   ComboBox->ShowList();
  415. }
  416.  
  417. //
  418. // Hide listbox part of combobox.
  419. //
  420. void
  421. TComboBoxWindow::CmHideList()
  422. {
  423.   ComboBox->HideList();
  424. }
  425.  
  426. //
  427. // Command enablers...
  428. //
  429. // Handle popup menus.  Grey out certain menu items depending on
  430. // whether a combobox has been created or menu item is inappropriate
  431. // for current type of combobox.
  432. //
  433. //
  434.  
  435. void
  436. TComboBoxWindow::CeSimple(TCommandEnabler& ce)
  437. {
  438.   ce.Enable(WhichComboBox != ID_SIMPLE_COMBOBOX || !ComboBox);
  439. }
  440.  
  441. void
  442. TComboBoxWindow::CeDropDown(TCommandEnabler& ce)
  443. {
  444.   ce.Enable(WhichComboBox != ID_DROPDOWN_COMBOBOX || !ComboBox);
  445. }
  446.  
  447. void
  448. TComboBoxWindow::CeDropDownList(TCommandEnabler& ce)
  449. {
  450.   ce.Enable(WhichComboBox != ID_DROPDOWNLIST_COMBOBOX || !ComboBox);
  451. }
  452.  
  453. void
  454. TComboBoxWindow::CeNotSimple(TCommandEnabler& ce)
  455. {
  456.   ce.Enable(WhichComboBox != ID_SIMPLE_COMBOBOX && ComboBox);
  457. }
  458.  
  459. void
  460. TComboBoxWindow::CeAny(TCommandEnabler& ce)
  461. {
  462.   ce.Enable(ComboBox != 0);
  463. }
  464.  
  465. //
  466. // Updates text fields that reflex the combobox's state.
  467. //
  468. void
  469. TComboBoxWindow::UpdateTextFields()
  470. {
  471.   char buf[TextLen] = "";
  472.   int  index = ComboBox->GetSelIndex();
  473.   int  strLen;
  474.  
  475.   if (index != -1) {     // is something selected?
  476.     ComboBox->GetString(buf, index);
  477.     strLen = ComboBox->GetStringLen(index);
  478.     CurSelOfListBox->SetText(buf);
  479.  
  480.     itoa(strLen, buf, 10);
  481.     SelStringLength->SetText(buf);
  482.  
  483.     itoa(index, buf, 10);
  484.     CurSelIndexOfListBox->SetText(buf);
  485.  
  486.     ComboBox->GetText(buf, TextLen - 1);
  487.     strLen = ComboBox->GetTextLen();
  488.     CurEditString->SetText(buf);
  489.  
  490.     if (WhichComboBox == ID_DROPDOWNLIST_COMBOBOX)
  491.       strLen = ComboBox->GetStringLen(ComboBox->GetSelIndex());
  492.  
  493.     itoa(strLen, buf, 10);
  494.     EditStringLength->SetText(buf);
  495.   }
  496.   else
  497.     ResetTextFields();
  498. }
  499.  
  500. //
  501. // Reset text fields to blanks.
  502. //
  503. void
  504. TComboBoxWindow::ResetTextFields()
  505. {
  506.   CurSelOfListBox->SetText(" ");
  507.   SelStringLength->SetText(" ");
  508.   CurSelIndexOfListBox->SetText(" ");
  509.   CurEditString->SetText(" ");
  510.   EditStringLength->SetText(" ");
  511. }
  512.  
  513. //
  514. // Get string from user.  Return 1 if successful, 0 otherwise.
  515. // assumes string length of TextLen - 1.
  516. //
  517. int
  518. TComboBoxWindow::InputString(char* pmpt, char* s)
  519. {
  520.   return TInputDialog(this, "String", pmpt, s, TextLen - 1).Execute() == IDOK;
  521. }
  522.  
  523. int
  524. TComboBoxWindow::InputNumber(char* pmpt, char* s)
  525. {
  526.   return TInputDialog(this, "String", pmpt, s, TextLen-1, 0,
  527.                       new TFilterValidator("0-9")).Execute() == IDOK;
  528. }
  529.  
  530. //
  531. // Get string and number (index) from user.  Return 1 if successful, 0
  532. // otherwise. Assumes string length of TextLen - 1.
  533. //
  534. int
  535. TComboBoxWindow::InputStringAndNumber(char* pmpt, char* s, int& n)
  536. {
  537.   char sbuf[TextLen] = "";
  538.   char nbuf[TextLen] = "";
  539.   TInputDialog getStr(this, "String", pmpt, sbuf, TextLen - 1);
  540.  
  541.   // This input dialog has a validator that only accepts digits
  542.   //
  543.   TInputDialog getNum(this, "String", "Enter number:", nbuf, TextLen - 1,
  544.     0, new TFilterValidator("0-9"));
  545.  
  546.   if (getStr.Execute() == IDOK && getNum.Execute() == IDOK) {
  547.     strcpy(s, sbuf);
  548.     n = atoi(nbuf);
  549.     return 1;
  550.   }
  551.   else
  552.     return 0;
  553. }
  554.  
  555.  
  556. //
  557. // class TComboBoxApp
  558. // ~~~~~ ~~~~~~~~~~~~
  559. class TComboBoxApp : public TApplication {
  560.   public:
  561.     void InitMainWindow();
  562. };
  563.  
  564. void
  565. TComboBoxApp::InitMainWindow()
  566. {
  567.   TFrameWindow* frame = new TFrameWindow(0, "ComboBox example", new
  568.     TComboBoxWindow);
  569.   frame->AssignMenu(IDM_COMBOBOX);
  570.   SetMainWindow(frame);
  571. }
  572.  
  573. int
  574. OwlMain(int /*argc*/, char* /*argv*/ [])
  575. {
  576.   return TComboBoxApp().Run();
  577. }
  578.